package com.evan.review.viewpager;

import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.RadioGroup;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.fragment.app.FragmentStatePagerAdapter;
import androidx.viewpager.widget.ViewPager;

import com.evan.review.R;
import com.google.android.material.tabs.TabLayout;

/**
 * 传统ViewPager示例Activity
 * 展示了FragmentPagerAdapter和FragmentStatePagerAdapter的使用方式和区别
 */
public class ClassicViewPagerActivity extends AppCompatActivity {
    
    private static final String TAG = "ClassicViewPagerActivity";
    private static final int PAGE_COUNT = 5; // 页面总数
    
    private ViewPager viewPager; // ViewPager控件
    private TabLayout tabLayout; // 顶部标签页
    private RadioGroup rgAdapterType; // 选择适配器类型的单选按钮组
    private Button btnToggleOffscreenLimit; // 切换离屏缓存页面数量的按钮
    
    private int currentOffscreenLimit = 1; // 当前离屏页面缓存数量，默认为1
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_classic_viewpager);
        
        initViews(); // 初始化视图
        setupListeners(); // 设置监听器
        
        // 默认使用FragmentPagerAdapter
        setupViewPagerWithFragmentPagerAdapter();
    }
    
    /**
     * 初始化视图组件
     */
    private void initViews() {
        viewPager = findViewById(R.id.viewpager);
        tabLayout = findViewById(R.id.tab_layout);
        rgAdapterType = findViewById(R.id.rg_adapter_type);
        btnToggleOffscreenLimit = findViewById(R.id.btn_toggle_offscreen_limit);
    }
    
    /**
     * 设置事件监听器
     */
    private void setupListeners() {
        // 设置适配器类型单选按钮组的监听器
        rgAdapterType.setOnCheckedChangeListener((group, checkedId) -> {
            if (checkedId == R.id.rb_fragment_pager_adapter) {
                setupViewPagerWithFragmentPagerAdapter();
            } else if (checkedId == R.id.rb_fragment_state_pager_adapter) {
                setupViewPagerWithFragmentStatePagerAdapter();
            }
        });
        
        // 设置切换离屏页面缓存数量按钮的监听器
        btnToggleOffscreenLimit.setOnClickListener(v -> {
            toggleOffscreenPageLimit();
        });
        
        // 设置ViewPager页面切换监听器
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                // 此演示不需要处理滑动过程
            }
            
            @Override
            public void onPageSelected(int position) {
                Log.d(TAG, "onPageSelected: position=" + position);
            }
            
            @Override
            public void onPageScrollStateChanged(int state) {
                // 此演示不需要处理滑动状态变化
            }
        });
    }
    
    /**
     * 使用FragmentPagerAdapter设置ViewPager
     * 此适配器会保留所有Fragment实例但销毁视图，适合页面数量少的情况
     */
    private void setupViewPagerWithFragmentPagerAdapter() {
        Log.d(TAG, "设置ViewPager使用FragmentPagerAdapter");
        viewPager.setAdapter(new SimpleFragmentPagerAdapter(getSupportFragmentManager()));
        tabLayout.setupWithViewPager(viewPager);
        viewPager.setOffscreenPageLimit(currentOffscreenLimit);
        updateOffscreenLimitButtonText();
    }
    
    /**
     * 使用FragmentStatePagerAdapter设置ViewPager
     * 此适配器会销毁不可见的Fragment，仅保存状态，适合页面数量多的情况
     */
    private void setupViewPagerWithFragmentStatePagerAdapter() {
        Log.d(TAG, "设置ViewPager使用FragmentStatePagerAdapter");
        viewPager.setAdapter(new SimpleFragmentStatePagerAdapter(getSupportFragmentManager()));
        tabLayout.setupWithViewPager(viewPager);
        viewPager.setOffscreenPageLimit(currentOffscreenLimit);
        updateOffscreenLimitButtonText();
    }
    
    /**
     * 切换离屏页面缓存数量
     * 控制ViewPager预加载的页面数量
     */
    private void toggleOffscreenPageLimit() {
        if (currentOffscreenLimit == 1) {
            currentOffscreenLimit = 3;
        } else if (currentOffscreenLimit == 3) {
            currentOffscreenLimit = 0; // 默认行为
        } else {
            currentOffscreenLimit = 1;
        }
        
        viewPager.setOffscreenPageLimit(currentOffscreenLimit);
        updateOffscreenLimitButtonText();
        Log.d(TAG, "离屏页面缓存数量设置为: " + currentOffscreenLimit);
    }
    
    /**
     * 更新离屏页面缓存数量按钮的文字
     */
    private void updateOffscreenLimitButtonText() {
        String limitText = currentOffscreenLimit == 0 ? "默认 (1)" : String.valueOf(currentOffscreenLimit);
        btnToggleOffscreenLimit.setText("离屏缓存数量: " + limitText);
    }
    
    /**
     * 简单的FragmentPagerAdapter实现
     * 注：虽然此适配器已废弃，但出于学习目的仍使用它
     */
    @SuppressWarnings("deprecation")
    private class SimpleFragmentPagerAdapter extends FragmentPagerAdapter {
        
        // 各页面的背景颜色
        private final int[] COLORS = new int[] {
            Color.parseColor("#F44336"), // 红色
            Color.parseColor("#9C27B0"), // 紫色
            Color.parseColor("#3F51B5"), // 靛蓝色
            Color.parseColor("#4CAF50"), // 绿色
            Color.parseColor("#FF9800")  // 橙色
        };
        
        SimpleFragmentPagerAdapter(FragmentManager fm) {
            super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
        }
        
        @NonNull
        @Override
        public Fragment getItem(int position) {
            Log.d(TAG, "FragmentPagerAdapter.getItem: position=" + position);
            return SimplePageFragment.newInstance(position + 1, COLORS[position]);
        }
        
        @Override
        public int getCount() {
            return PAGE_COUNT;
        }
        
        @Override
        public CharSequence getPageTitle(int position) {
            return "页面 " + (position + 1);
        }
    }
    
    /**
     * 简单的FragmentStatePagerAdapter实现
     * 注：虽然此适配器已废弃，但出于学习目的仍使用它
     */
    @SuppressWarnings("deprecation")
    private class SimpleFragmentStatePagerAdapter extends FragmentStatePagerAdapter {
        
        // 各页面的背景颜色
        private final int[] COLORS = new int[] {
            Color.parseColor("#F44336"), // 红色
            Color.parseColor("#9C27B0"), // 紫色
            Color.parseColor("#3F51B5"), // 靛蓝色
            Color.parseColor("#4CAF50"), // 绿色
            Color.parseColor("#FF9800")  // 橙色
        };
        
        SimpleFragmentStatePagerAdapter(FragmentManager fm) {
            super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
        }
        
        @NonNull
        @Override
        public Fragment getItem(int position) {
            Log.d(TAG, "FragmentStatePagerAdapter.getItem: position=" + position);
            return SimplePageFragment.newInstance(position + 1, COLORS[position]);
        }
        
        @Override
        public int getCount() {
            return PAGE_COUNT;
        }
        
        @Override
        public CharSequence getPageTitle(int position) {
            return "页面 " + (position + 1);
        }
    }
} 